﻿using SIAKADCORE.Helpers;
using SIAKADCORE.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIAKADCORE.Controllers
{
    /// <summary>
    /// Kelas DetailMatakuliahPeriodeController
    /// </summary>
    public class DetailMatakuliahPeriodeController
    {
        /// <summary>
        /// Method untuk menambahkan entri detailMatakuliahPeriode.
        /// </summary>
        /// <param name="detailMatakuliahPeriode">Kelas DetailMatakuliahPeriode.</param>
        /// <returns>True ketika sukses menambahkan entri dan sebaliknya.</returns>
        public static bool Tambah(DetailMatakuliahPeriode detailMatakuliahPeriode)
        {
            string queryString = string.Format("INSERT INTO {0} ({1} ,{2} ,{3}) VALUES ('{4}' ,'{5}' ,'{6}')",
                DetailMatakuliahPeriode.TableName, DetailMatakuliahPeriode.ColumnNameIdDetailMatakuliahPeriode, DetailMatakuliahPeriode.ColumnNameIdMatakuliah,
                DetailMatakuliahPeriode.ColumnNameIdPeriode, detailMatakuliahPeriode.IdDetailMatakuliahPeriode, detailMatakuliahPeriode.IdMatakuliah,
                detailMatakuliahPeriode.IdPeriode);
            return SQLHelper.Instance.ExecuteNonQuery(queryString);
        }

        /// <summary>
        /// Method untuk mengubah entri detailMatakuliahPeriode.
        /// </summary>
        /// <param name="idDetailMatakuliahPeriode">Id detailMatakuliahPeriode yang akan diubah.</param>
        /// <param name="detailMatakuliahPeriode">Kelas DetailMatakuliahPeriode.</param>
        /// <returns>True ketika sukses mengubah entri dan sebaliknya.</returns>
        public static bool Ubah(string idDetailMatakuliahPeriode, DetailMatakuliahPeriode detailMatakuliahPeriode)
        {
            string queryString = string.Format("UPDATE {0} SET {1} = '{2}' ,{3} = '{4}' ,{5} = '{6}' WHERE {1} = '{7}'",
                DetailMatakuliahPeriode.TableName, DetailMatakuliahPeriode.ColumnNameIdDetailMatakuliahPeriode,
                detailMatakuliahPeriode.IdDetailMatakuliahPeriode, DetailMatakuliahPeriode.ColumnNameIdMatakuliah,
                detailMatakuliahPeriode.IdMatakuliah, DetailMatakuliahPeriode.ColumnNameIdPeriode,
                detailMatakuliahPeriode.IdPeriode, idDetailMatakuliahPeriode);
            return SQLHelper.Instance.ExecuteNonQuery(queryString);
        }

        /// <summary>
        /// Method untuk menghapus entri detailMatakuliahPeriode.
        /// </summary>
        /// <param name="idDetailMatakuliahPeriode">id detailMatakuliahPeriode yang akan dihapus.</param>
        /// <returns>True ketika sukses menghapus entri dan sebaliknya.</returns>
        public static bool Hapus(string idDetailMatakuliahPeriode)
        {
            string queryString = string.Format("DELETE FROM {0} WHERE {1} = '{2}'",
                DetailMatakuliahPeriode.TableName, DetailMatakuliahPeriode.ColumnNameIdDetailMatakuliahPeriode, idDetailMatakuliahPeriode);
            return SQLHelper.Instance.ExecuteNonQuery(queryString);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel detailMatakuliahPeriode.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset)
        {
            string queryString = string.Format("SELECT {0} ,{1} ,{2} FROM {3}",
                DetailMatakuliahPeriode.ColumnNameIdDetailMatakuliahPeriode, DetailMatakuliahPeriode.ColumnNameIdMatakuliah,
                DetailMatakuliahPeriode.ColumnNameIdPeriode, DetailMatakuliahPeriode.TableName);
            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel detailMatakuliahPeriode.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabelPreview(out DataSet dataset)
        {
            string queryString = string.Format("SELECT [detail_matakuliah_periode].{0} ,[matakuliah].{1} ,[periode].{2} FROM {3}, {4}, {5} WHERE [detail_matakuliah_periode].{6} = [matakuliah].{7} AND [detail_matakuliah_periode].{8} = [periode].{9}",
                DetailMatakuliahPeriode.ColumnNameIdDetailMatakuliahPeriode, Matakuliah.ColumnNameNamaMatakuliah, Periode.ColumnNameNamaPeriode,
                DetailMatakuliahPeriode.TableName, Matakuliah.TableName, Periode.TabelName,
                DetailMatakuliahPeriode.ColumnNameIdMatakuliah, Matakuliah.ColumnNameIdMatakuliah,
                DetailMatakuliahPeriode.ColumnNameIdPeriode, Periode.ColumnNameIdPeriode);
            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel detailMataKuliahPeriode.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <param name="customQueryString">Kustomisasi query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset, string customQueryString)
        {
            return SQLHelper.Instance.ExecuteReader(customQueryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan id detailMatakuliahPeriode. Digunakan pada saat memasukkan entri baru.
        /// </summary>
        /// <returns>string kosong ketika terjadi error atau id detailMatakuliahPeriode baru.</returns>
        public static string GetID()
        {
            var dataset = new DataSet();
            bool isQueryAccomplished = GetTabel(out dataset);
            if (!isQueryAccomplished) return string.Empty;

            return SQLHelper.Instance.GetID(DetailMatakuliahPeriode.IdPrefix, DetailMatakuliahPeriode.IdLength, ref dataset);
        }
    }
}
